interface IRes {
  code: number
  status: string
  data: any
}


// 字面量类型与联合类型
interface IRes2 {
  code: 1000 | 10001 | 10002
  status: 'success' | 'failure'
  data: any
}

declare var res: IRes2

if (res.status === 'failure') {

}

// 联合类型
/**
 * 对于联合类型中的函数类型，需要使用括号()包裹起来
 * 函数类型并不存在字面量类型，因此这里的 (() => {}) 就是一个合法的函数类型
 * 你可以在联合类型中进一步嵌套联合类型，但这些嵌套的联合类型最终都会被展平到第一级中
*/
interface Tmp {
  mixed: true | (1 | 2)
}

declare var tmp15: Tmp
tmp15.mixed === true
tmp15.mixed === 1

// 联合类型的常用场景之一是通过多个对象类型的联合，来实现手动的互斥属性，即这一属性如果有字段1，那就没有字段2：

interface Tmp2 {
  user: {
    vip: true
    exprires: string
  } | {
    vip: false
    promotion: string
  }
}

declare var tmp16: Tmp2

if (tmp16.user.vip) {
  // 等于 ture, 就没有 promotion 属性
  tmp16.user.exprires
}

// 通过类型别名来复用一组字面量联合类型：
type Code = 1000 | 1001 | 1002
type Status = "success" | 'failure'


interface IRes3 {
  code: Code,
  status: Status
}

declare var ires3: IRes3
if (ires3.status === 'failure') {

}

// 对象字面量类型

// 枚举
const pageUrl = {
  Home_Page_Url: "url1",
  Setting_Page_Url: "url2",
  Share_Page_Url: "url3",
}
// 写成枚举形式
enum pageUrlEnum {
  Home_Page_Url ="url1",
  Setting_Page_Url = "url2",
  Share_Page_Url = "url3",
}

pageUrlEnum.Home_Page_Url

// 没有值的枚举，默认使用数据枚举，并且从0开始
enum IEnum {
  Foo,
  Bar,
  Baz
}

IEnum.Foo

// 对象只能通过键取到值，而枚举是双向的，可以从枚举到枚举成员